package com.yuandian.base.service.impl;

import com.yuandian.base.service.IScriptService;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * 说明：脚本服务实现
 * @Author zfsn
 * @Date 2023/2/20 15:56
 */
@Service
public class ScriptServiceImpl implements IScriptService {

	/**
	 * 脚本引擎管理器
	 */
	private ScriptEngineManager manager;

	@PostConstruct
	public void init() {
		// 创建一个脚本引擎管理器
		this.manager = new ScriptEngineManager();
	}

	/**
	 * 编译js脚本获取执行器
	 * @param jsScript js脚本
	 * @return 执行器
	 */
	@Override
	public Invocable compile(String jsScript) {
		ScriptEngine jsEngine = manager.getEngineByName("js");
		try {
			jsEngine.eval(jsScript);
		} catch (ScriptException e) {
			e.printStackTrace();
		}
		return (Invocable) jsEngine;
	}

	/**
	 * 执行通用接口校验脚本
	 * @param jsScript js脚本
	 * @param paramObj 参数值
	 * @return 可能返回多种类型，如果是Boolean类型，为true时校验通过；如果类型为String，则表示校验不通过，值就用来提示给前端
	 */
	@Override
	public Object executeCommonValidation(String jsScript, Object paramObj) {
		Object result = Boolean.FALSE;
		Invocable inv = compile(jsScript);
		try {
			result = inv.invokeFunction("validation", paramObj);
		} catch (ScriptException | NoSuchMethodException e) {
			e.printStackTrace();
		}
		return result;
	}
}
